package com.smart.web.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.smart.common.base.result.ResponseResult;
import com.smart.web.reqeust.CartRequestParams;
import com.smart.web.service.CartItemService;
import com.smart.web.vo.CartItemVo;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.validation.constraints.Min;
import java.util.List;

/**
 * 必须登录  cookie + session
 * 1.查看购物信息
 * 2 添加商品到购物车
 * 3 批量删除购物车
 * 4 删除单条购物车
 * 5 修改购物车信息
 * <p>
 * QO   请求参数对象   作为控制层入口参数  业务层入口参数
 * VO   对象 显示对象  作为控制层的返回对象或者业务层的返回对象
 * PO   对象 entity   作为数据层的返回对象 数据层入口参数
 * DTO  对象 数据传输对象  服务跟服务之间传输对象  分布式 Dubbo  业务层远程调用业务层  DTO
 * DAO  赤化层
 * BO
 * POJO 所有企业开发对象的统称
 *
 * 判断库存  + 普通商品  + 秒杀
 *
 */
@RestController
@RequestMapping("/cart")
@Validated
public class CartController {
    @Resource
    CartItemService cartItemService;

    /**
     * @return
     */
    @PostMapping("/add")
    public ResponseResult<Integer> add(@Validated @RequestBody CartRequestParams cartRequestParams) {
        return ResponseResult.success(cartItemService.save(cartRequestParams));
    }

    @DeleteMapping("/del/{cartId}")
    public ResponseResult<Integer> del(@PathVariable Long cartId) {
        return ResponseResult.success(cartItemService.del(cartId));
    }

    @GetMapping("/list/{page}/{size}")
    public ResponseResult<IPage<CartItemVo>> list(
            @RequestParam Long memberId,
            @PathVariable @RequestParam(defaultValue = "1") Integer page,
            @PathVariable @RequestParam(defaultValue = "10") Integer size) {
        return ResponseResult.success(cartItemService.list(memberId, page, size));
    }

    @DeleteMapping("/batch")
    public ResponseResult<Integer> batchDel(@RequestParam List<Long> ids) {
        return ResponseResult.success(cartItemService.batchDel(ids));
    }

    @PutMapping("/mod/number")
    public ResponseResult<Integer> mod(Long cartId, @Min(value = 1, message = "数量必须大于或等于1") Integer quantity) {
        return ResponseResult.success(cartItemService.modifyQuantity(cartId, quantity));
    }
}
